package v2ch4.ExecSQL;

import java.io.*;
import java.sql.*;
import java.util.*;

import org.apache.commons.dbcp.*;
import org.apache.commons.pool.impl.*;


public class ConnectionPool
{
    protected GenericObjectPool connectionPool;

//    nitialContext initContext= new InitialContext();
//    DataSource ds = (DataSource) initContext.lookup("java:comp/env/jdbc/dbconnect");
//    Connection conn = ds.getConnection();
//    conn.close();

    public void initConnectionPool( String driver, String dbURL, String dbUser, String dbPswd )
    {
        try
        {
            Class.forName(driver).newInstance(); //создаем новый объект класса драйвера, тем самым инициализируя его

            connectionPool = new GenericObjectPool(null);//создаем GenericObjectPool
            //создаем connection factory ("фабрика соединений" - объект который будет создавать соединения)
            ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(dbURL, dbUser, dbPswd);

            //создаем PoolableConnectionFactory
            new PoolableConnectionFactory(connectionFactory, connectionPool, null, "SELECT 1", false, true);

            new PoolingDataSource(connectionPool);
            connectionPool.setMaxIdle(20);//устанавливаем максимальное кол-во простаивающих соединений
            connectionPool.setMaxActive(300);//устанавилваем макс. кол-во активных соединений
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }

    /**
     * Функция получения connection из пула
     * @return Connection
     */
    public final Connection getConnection()
    {
        try
        {
            if(connectionPool.getMaxActive() <= connectionPool.getNumActive())
            {
                System.err.println("Connections limit is over!!!");
            }
            Connection con = (Connection)connectionPool.borrowObject();
            return con;
        }
        catch( Exception ex )
        {
            ex.printStackTrace();
            return null;
        }
    }

    /**
     * Функция возвращения connection в пул
     */
    public final void returnConnection(Connection con)
    {
        if(con == null)
        {
            System.err.println("Returning NULL to pool!!!");
            return;
        }

        try
        {
            connectionPool.returnObject(con);
        }
        catch(Exception ex)
        {
        }
    }


    public static void main(String[] args)
    {
        Properties props = null;
        try {
            props = PropertyReader.getProps();
        } catch (IOException e) {
            e.printStackTrace();
        }
        String drivers = props.getProperty("jdbc.drivers");
        if (drivers != null) System.setProperty("jdbc.drivers", drivers);
        String url = props.getProperty("jdbc.url");
        String username = props.getProperty("jdbc.username");
        String password = props.getProperty("jdbc.password");

        //создаем наш объект ConnectionPool
        ConnectionPool pool = new ConnectionPool();
        //единожды инициализируем его указав класс драйвера, URL базы данных, а также логин и пароль к базе данных
        pool.initConnectionPool(drivers, url, username, password);

        //получаем connection
        Connection con = pool.getConnection();

        BookDAO bookDAO = new BookDAO(con);
        Book book = bookDAO.getBook("15716");
        System.out.println(book.toString());
        //что нибудь делаем
//        PreparedStatement ps = null;
//
//        try {
//            ps = con.prepareStatement("SELECT * FROM books WHERE Publisher_Id=?");
//            ps.setString(1, "01262");
//            ResultSet rs = ps.executeQuery();
//            //получаем следующую строку результата, если она есть. '''В самом начале курсор стоит перед'''
//            //'''первой строкой'''. Если строка есть функция next() возвращает true и передвигает курсор
//            //на следующую строку
//            while( rs.next() )
//            {
//                  System.out.println(rs.getString("Title"));
//            }
//       } catch (SQLException e) {
//            e.printStackTrace();
//       } finally {
//            if (ps != null) {
//                try {
//                    ps.close();
//                } catch (SQLException e) {
//                    e.printStackTrace();
//                }
//            }
//       }

        //возвращаем соединение в пул
        pool.returnConnection(con);
    }
}